/*
 * @Author: Xavier 1305433186@qq.com
 * @Date: 2024-08-15 13:55:20
 * @LastEditors: Xavier 1305433186@qq.com
 * @LastEditTime: 2024-08-16 16:10:35
 * @FilePath: \JS32T031_SDK\User\board\led_show.c
 * @Description:
 *
 * STAYTRUE (c) 2024 by ${Xavier}, All Rights Reserved.
 */
#include "include.h"
#include "board/led_show.h"

#define LED_COM_0_PINx LL_GPIO_PIN_0
#define LED_COM_1_PINx LL_GPIO_PIN_1
#define LED_COM_2_PINx LL_GPIO_PIN_4
#define LED_COM_3_PINx LL_GPIO_PIN_5
#define LED_COM_4_PINx LL_GPIO_PIN_7
#define LED_COM_GPIOx GPIOB

#define LED_SEG_0_PINx LL_GPIO_PIN_2
#define LED_SEG_1_PINx LL_GPIO_PIN_3
#define LED_SEG_2_PINx LL_GPIO_PIN_4
#define LED_SEG_3_PINx LL_GPIO_PIN_5
#define LED_SEG_4_PINx LL_GPIO_PIN_6
#define LED_SEG_5_PINx LL_GPIO_PIN_7
#define LED_SEG_6_PINx LL_GPIO_PIN_8
#define LED_SEG_7_PINx LL_GPIO_PIN_9
#define LED_SEG_GPIOx GPIOA

enum ICON_LIST
{
    SPEED_ICON,
    TIME_ICON,
    DIR_ICON,
    CAL_ICON,
};
u8 DisplayBuff[5];
u8 ComCnt;

/*数字的数据  共阴不带小数点0-F段码  */
static const uint8_t num_data[] = {0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x07, 0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
void led_io_init(void)
{
    // com
    TYPE_LL_GPIO_INIT gpio_struct;
    memset(&gpio_struct, 0x00, sizeof(gpio_struct));
    gpio_struct.gpio_pin = LED_COM_0_PINx | LED_COM_1_PINx | LED_COM_2_PINx |
                           LED_COM_3_PINx | LED_COM_4_PINx;
    gpio_struct.gpio_mode = LL_GPIO_MODE_OUT;
    gpio_struct.gpio_speed_level = LL_GPIO_SPEED_LEVEL_0;
    ll_gpio_init(LED_COM_GPIOx, &gpio_struct);

    // seg
    memset(&gpio_struct, 0x00, sizeof(gpio_struct));
    gpio_struct.gpio_pin = LED_SEG_0_PINx | LED_SEG_1_PINx | LED_SEG_2_PINx | LED_SEG_3_PINx |
                           LED_SEG_4_PINx | LED_SEG_5_PINx | LED_SEG_6_PINx | LED_SEG_7_PINx;
    gpio_struct.gpio_mode = LL_GPIO_MODE_OUT;
    ll_gpio_init(LED_SEG_GPIOx, &gpio_struct);

    // Multiply LED current by 1.5 times
    SYSCTRL_REG_OPT(SYSCTRL->SYS_CON1 |= LL_SYSCTRL_CON1_LED_ISELX);
}
void led_driver(void)
{

    ll_gpio_set_bits(LED_COM_GPIOx, LED_COM_0_PINx | LED_COM_1_PINx | LED_COM_2_PINx |
                                        LED_COM_3_PINx | LED_COM_4_PINx);
    ll_gpio_reset_bits(LED_SEG_GPIOx, LED_SEG_0_PINx | LED_SEG_1_PINx | LED_SEG_2_PINx | LED_SEG_3_PINx |
                                          LED_SEG_4_PINx | LED_SEG_5_PINx | LED_SEG_6_PINx | LED_SEG_7_PINx);
    if (DisplayBuff[ComCnt] & BIT(0))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_0_PINx);
    if (DisplayBuff[ComCnt] & BIT(1))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_1_PINx);
    if (DisplayBuff[ComCnt] & BIT(2))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_2_PINx);
    if (DisplayBuff[ComCnt] & BIT(3))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_3_PINx);
    if (DisplayBuff[ComCnt] & BIT(4))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_4_PINx);
    if (DisplayBuff[ComCnt] & BIT(5))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_5_PINx);
    if (DisplayBuff[ComCnt] & BIT(6))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_6_PINx);
    if (DisplayBuff[ComCnt] & BIT(7))
        ll_gpio_set_bits(LED_SEG_GPIOx, LED_SEG_7_PINx);

    if (ComCnt == 0)
        ll_gpio_reset_bits(LED_COM_GPIOx, LED_COM_0_PINx); // 1
    else if (ComCnt == 1)
        ll_gpio_reset_bits(LED_COM_GPIOx, LED_COM_1_PINx); // 2
    else if (ComCnt == 2)
        ll_gpio_reset_bits(LED_COM_GPIOx, LED_COM_2_PINx); // 3
    else if (ComCnt == 3)
        ll_gpio_reset_bits(LED_COM_GPIOx, LED_COM_3_PINx); // 4
    else if (ComCnt == 4)
        ll_gpio_reset_bits(LED_COM_GPIOx, LED_COM_4_PINx); // 5
    ComCnt++;
    if (ComCnt >= sizeof(DisplayBuff))
    {
        ComCnt = 0;
    }
}
void led_display_init(void)
{
    memset(DisplayBuff, 0XFF, sizeof(DisplayBuff));
}

/*设置第一位数字,传入数字如果大于十，那么不显示*/
static inline void set_num_1(uint8_t num)
{
    DisplayBuff[1] &= (~(num_data[8]));
    if (num < 10)
    {
        DisplayBuff[1] |= num_data[num];
    }
}

/*设置第二位数字,传入数字如果大于十，那么不显示*/
static inline void set_num_2(uint8_t num)
{
    DisplayBuff[2] &= (~(num_data[8]));
    if (num < 10)
    {
        DisplayBuff[2] |= num_data[num];
    }
}

/*设置第三位数字,传入数字如果大于十，那么不显示*/
static inline void set_num_3(uint8_t num)
{
    DisplayBuff[3] &= (~(num_data[8]));
    if (num < 10)
    {
        DisplayBuff[3] |= num_data[num];
    }
}

/*设置第四位数字,传入数字如果大于十，那么不显示*/
static inline void set_num_4(uint8_t num)
{
    DisplayBuff[4] &= (~(num_data[8]));
    if (num < 10)
    {
        DisplayBuff[4] |= num_data[num];
    }
}

static inline void set_speed_icon(bool en)
{
    if (en == true)
    {
        DisplayBuff[0] |= ((0x04));
    }
    else
    {
        DisplayBuff[0] &= (~(0x04));
    }
}
static inline void set_time_icon(bool en)
{
    if (en == true)
    {
        DisplayBuff[0] |= ((0x08));
    }
    else
    {
        DisplayBuff[0] &= (~(0x08));
    }
}
static inline void set_dist_icon(bool en)
{
    if (en == true)
    {
        DisplayBuff[0] |= ((0x10));
    }
    else
    {
        DisplayBuff[0] &= (~(0x10));
    }
}
static inline void set_cal_icon(bool en)
{
    if (en == true)
    {
        DisplayBuff[0] |= ((0x20));
    }
    else
    {
        DisplayBuff[0] &= (~(0x20));
    }
}
static inline void set_icon(unsigned char icon)
{
    DisplayBuff[0] &= (~(0x03));
    switch (icon)
    {
    case SPEED_ICON:
        set_speed_icon(true);
        set_time_icon(false);
        set_dist_icon(false);
        set_cal_icon(false);
        break;
    case TIME_ICON:
        set_speed_icon(false);
        set_time_icon(true);
        set_dist_icon(false);
        set_cal_icon(false);
        break;
    case DIR_ICON:
        set_speed_icon(false);
        set_time_icon(false);
        set_dist_icon(true);
        set_cal_icon(false);
        break;
    case CAL_ICON:
        set_speed_icon(false);
        set_time_icon(false);
        set_dist_icon(false);
        set_cal_icon(true);
        break;
    default:
        break;
    }
}
/*冒号*/
static void set_colon(bool en)
{
    if (en == true)
    {
        DisplayBuff[2] |= ((0x80));
        DisplayBuff[3] |= ((0x80));
    }
    else
    {
        DisplayBuff[2] &= (~(0x80));
        DisplayBuff[3] &= (~(0x80));
    }
}
/*小数点*/
static void set_dot(bool en)
{
    if (en == true)
    {
        DisplayBuff[3] |= ((0x80));
    }
    else
    {
        DisplayBuff[3] &= (~(0x80));
    }
}
void set_valid_num(uint32_t temp_val)
{
    if (temp_val < 10)
    {
        set_num_1(0xff);
        set_num_2(0xff);
        set_num_3(0xff);
        set_num_4(temp_val % 10);
    }
    else if (temp_val < 100)
    {
        set_num_1(0xff);
        set_num_2(0xff);
        set_num_3(temp_val / 10 % 10);
        set_num_4(temp_val % 10);
    }
    else if (temp_val < 1000)
    {
        set_num_1(0xff);
        set_num_2(temp_val / 100 % 10);
        set_num_3(temp_val / 10 % 10);
        set_num_4(temp_val % 10);
    }
    else
    {
        set_num_1(temp_val / 1000 % 10);
        set_num_2(temp_val / 100 % 10);
        set_num_3(temp_val / 10 % 10);
        set_num_4(temp_val % 10);
    }
}
/*显示带小数点的数据 */
void set_valid_decimals_num(uint32_t temp_val)
{
    set_dot(true);
    if (temp_val < 1000)
    {
        set_num_1(0xff);
        set_num_2(temp_val / 100 % 10);
        set_num_3(temp_val / 10 % 10);
        set_num_4(temp_val % 10);
    }else{
        
        set_num_1(temp_val / 1000 % 10);
        set_num_2(temp_val / 100 % 10);
        set_num_3(temp_val / 10 % 10);
        set_num_4(temp_val % 10);
    }
}

void update_show_speed(uint32_t temp_val)
{
    set_colon(false); // 点亮冒号
    set_icon(SPEED_ICON);
    set_num_1(temp_val % 10000 / 1000);
    set_num_2(temp_val % 1000 / 100);
    set_num_3(temp_val % 100 / 10);
    set_num_4(temp_val % 10);
}
void update_show_time(uint32_t temp_val)
{
    uint32_t timer_s = temp_val % 60;
    uint32_t timer_m = temp_val / 60;
    set_colon(true); // 点亮冒号
    set_icon(TIME_ICON);
    if (timer_m >= 10)
    {
        set_num_1(timer_m / 10);
    }
    else
    {
        set_num_1(0xff);
    }
    set_num_2(timer_m % 10);
    set_num_3(timer_s / 10);
    set_num_4(timer_s % 10);
}
void updata_show_dist(uint32_t temp_val) // 单位 0.01
{
    set_icon(DIR_ICON);
    set_colon(false); // 点亮冒号
    if (temp_val < 9999)
    {
        set_valid_decimals_num(temp_val);
    }
    else if (temp_val < 999999)
    {
        set_valid_num(temp_val / 100);
    }
}
void updata_show_cal(uint32_t temp_val)
{
    set_colon(false); // 点亮冒号
    set_icon(CAL_ICON);
    if (temp_val > 9999)
    {
        temp_val = 9999;
    }
    set_valid_num(temp_val);
}